#ifndef __BOOTLOADER_DEFINE_H
#define __BOOTLOADER_DEFINE_H

#include "stm32f407xx.h"
/**
 * 【 flash 相关配置项】
 * 说明:
 *    配置各个分区的大小
 * 注意事项:
 *    ！！！片内 Flash 需进行页对齐，分区首地址必须是 Flash 的每个独立 page 或 sector 的首地址，否则固件无法运行！！！
 *    ！！！放置在 SPI Flash 的分区至少需要最小擦写粒度的整数倍为单位进行对齐，建议以 sector 的整数倍为单位进行对齐！！！
 */
/* === 片上 Flash 配置 (STM32F407ZGT6 - 1MB) === */
#define ONCHIP_FLASH_SIZE                   (1024 * 1024)   /* 片上 Flash 总容量: 1MB */
#define BOOTLOADER_SIZE                     (128 * 1024)     /* Bootloader 分区: 128KB */
#define APP_PART_SIZE                       (896 * 1024)    /* APP 分区: 896KB */

/* 片上 Flash 地址计算 */
#define ONCHIP_FLASH_BASE_ADDR              ((uint32_t)FLASH_BASE)  /* 片上 Flash 基地址 */
#define ONCHIP_FLASH_END_ADDR               ((uint32_t)(FLASH_BASE + ONCHIP_FLASH_SIZE))  /* 片上 Flash 末地址 */
#define BOOTLOADER_ADDR                     ((uint32_t)(FLASH_BASE))  /* Bootloader 起始地址 */
#define APP_PART_ADDR                       ((uint32_t)(FLASH_BASE + BOOTLOADER_SIZE))  /* APP 分区起始地址 */

/* === SPI Flash 配置 (Winbond W25Q128JV - 16MB) === */
#define SPI_FLASH_SIZE                      (16 * 1024 * 1024)   /* SPI Flash 总容量: 16MB */
#define SPI_FLASH_SECTOR_SIZE               (4 * 1024)           /* 扇区大小: 4KB */

/* SPI Flash 分区大小 */
#define DOWNLOAD_PART_SIZE                  (4 * 1024 * 1024)    /* Download 下载区: 4MB */
#define USER_PART_SIZE                      (8 * 1024 * 1024)    /* 用户自定义分区: 8MB */

/* SPI Flash 地址计算 */
#define SPI_FLASH_BASE_ADDR                 ((uint32_t)0x00000000)    /* SPI Flash 起始地址 */
#define DOWNLOAD_ADDR                       ((uint32_t)(SPI_FLASH_BASE_ADDR)) /* Download 起始地址 */
#define USER_PART_ADDR                      ((uint32_t)(DOWNLOAD_ADDR + DOWNLOAD_PART_SIZE)) /* 用户分区起始地址 */
#define SPI_FLASH_END_ADDR                  ((uint32_t)(SPI_FLASH_BASE_ADDR + SPI_FLASH_SIZE))  /* SPI Flash 末地址 */

#endif //__BOOTLOADER_DEFINE_H
